﻿/**
 \file table.h
 Интерфейс модуля работы с таблицами символов: экспортируемые 
 функции и константы.

 \def GLOBAL 
 Глобальный элемент таблицы символов.
 \def LOCAL
 Локальный элемент таблицы символов.

 \def VAR 
 Формальный параметр-переменная.
 \def CONST
 Формальный параметр-константа.
 \def USUAL
 Обычный формальный параметр.

 \def OPEN
 Элеиент открыт (может экспортироваться).
 \def CLOSE
 Элемент закрыт.

 \def GENERAL_TABLE
 Главная таблица символов.
 \def MODULES_TABLE
 Таблица символов для внешних, импортируемых модулей.

 \def TYPES
 Номер секции экспортируемых типов в символьном файле.
 \def CONSTS
 Номер секции экспортируемых констант в символьном файле.
 \def PROCS
 Номер секции экспортируемых процедур в символьном файле.

 \def cType
 Класс элементов таблицы символов: тип данных.
 \def cConst
 Класс элементов таблицы символов: константа.
 \def cVar
 Класс элементов таблицы символов: переменная.
 \def cProc
 Класс элементов таблицы символов: процедура.
 \def cNone
 Класс элементов таблицы символов: пустой класс.
 \def cImportMod
 Класс элементов таблицы символов: внешний модуль.
 \def cSynImportMod
 Класс элементов таблицы символов: Синоним имени внешнего модуля.
 \def cStdProc
 Класс элементов таблицы символов: Встроенная процедура.
 \def cModule
 Класс элементов таблицы символов: Имя модуля.

 \def tBase
 Тип элемента таблицы символов: Базовый тип данных.
 \def tSimple
 Тип элемента таблицы символов: Переменная.
 \def tPointer
 Тип элемента таблицы символов: Указатель.
 \def tArray
 Тип элемента таблицы символов: Массив.
 \def tProc
 Тип элемента таблицы символов: Процедурный тип или процедура.
 \def tOpenArray
 Тип элемента таблицы символов: Открытый массив.
*/

#define GLOBAL 0
#define LOCAL  1

#define USUAL 0
#define VAR   1
#define CONST 2

#define CLOSE 0
#define OPEN  1

#define GENERAL_TABLE 0
#define MODULES_TABLE 1

#define TYPES  1
#define CONSTS 2
#define PROCS  3

#define cType         1
#define cConst        2
#define cVar          3
#define cProc         4
#define cNone         5
#define cImportMod    6
#define cSynImportMod 7
#define cStdProc      8
#define cModule       9

#define tBase         10
#define tSimple       11
#define tRecord       12
#define tPointer      13
#define tArray        14
#define tProc         15
#define tOpenArray    16

/**
 \union Data
 Хранит в себе значения числовых, символьных, 
 строковых констант, указатель на предка структуры 
 или возвращаемый тип процедуры или процедурного типа.
*/
union Data {
 /** Дробная числовая константа одинарной точности. */
 float fval; 
 /** Дробная числовая константа двойной точности. */
 double dval;
 /** Числовые и символьные константы. */
 unsigned long int *lval;
 /** Строковые константы. */
 char *sval;
 /** Указатель на предка структуры или возвращаемый тип. */
 struct Item *parent; 
};

/**
 \struct Item
 Элемент таблицы символов.
*/
struct Item {
 /** Имя элемента. */
 unsigned char *name;
 /** Класс. */
 unsigned char cls;         
 /** Тип. */
 unsigned char type;        
 /** Область видимости: GLOBAL, LOCAL. */
 unsigned char scope;
 /** Тип формального параметра или открытость элемента. */
 unsigned char flags;       
 /** Смещение внутри структуры (если элемент - член структуры),
     либо смещение относительно начала стека, если это - формальный параметр. */
 unsigned long int offset;
 /** Размер элемента. */
 unsigned long int size;
 /** Разные данные, зависящие от типа элемента. */
 union Data one;
 /** Указатель на дочерний элемент. */
 struct Item *child;
 /** Указатель на следующий в спике элемент. */
 struct Item *next; 
};

/**
 \struct Level
 Уровень таблицы символов.
*/
struct Level {
 /** Указатель на первый элемент уровня. */
 struct Item  *items;
 /** Указатель на следующий уровень. */
 struct Level *next;
};

void SetPredScope(struct Item *item);
struct Item *GetPredScope(void);
struct Level *GetCurLevel(void);
struct Level *GetModules(void);
void FillItem(struct Item *item, unsigned char cls,
              unsigned char type,unsigned char scope, 
              unsigned char flags, unsigned long int size, 
              union Data one, struct Item *child);
void DelItems(struct Item *item);
struct Item *SearchItem(struct Item *first, char *name);
struct Item *Search(char *name, char cls);
struct Item *AddItem(struct Item *first, char *name);
void DeleteLevel(void);
void AddLevel(unsigned char TableType);

